/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador;
import compilador.datos.*;
import java.io.BufferedReader;
import java.util.Hashtable;
import javax.swing.JTextArea;
/**
 *
 * @author Iñaki Goffard, Javier Sanchez Pardo
 */
public class AnalizadorLex {
    private static final String mensajesError[] = {
        "ERROR LÉXICO : Carácter no esperado",  //0
        "ERROR LÉXICO : Parte decimal mal formada", //1
        "ERROR LÉXICO : Parte exponencial mal formada", //2
        "ERROR LÉXICO : Constante carácter mal formada",  //3
        "ERROR LÉXICO : Operador lógico mal formado",    //4
        "ERROR LÉXICO : Número entero mal formado"    //5
    };
    
    private final String NOM_FICH_TRAZAS_ALEX = "TrazasALex.log";
    private Hashtable listaTokens;
    private Hashtable listaPalRes;
    private Hashtable listaPalConv;
    private String lexema;
    private char car;
   // private Token token;
    private Archivo archivo;
    private Archivo archivoTrazas;
    private int estado;
    private int numToken;
    private int posToken;
    private boolean fin;
    private boolean abortar;
    //Punteros de fila y de columna que apuntan al ultimo caracter leido del fichero fuente.
    private int iNumFilaFich, iNumColumnaFich;
    //Punteros de fila y de columna que apuntan al inicio de cada token.
    private int iNumFilaTok, iNumColumnaTok;
    //Flag para indicar el funcionamiento en modo traza.
    private boolean bModoTraza;
    private GestorErrores gestErr;
    //Control textArea que muestra los tokens que se van generando (para facilitar la depuracion)
    private JTextArea textAreaTokens = null;
    //StringBuffer que contiene el código fuente que se va leyendo (para facilitar la depuracion por consola)
    private StringBuffer sbCodFuente = new StringBuffer();
    //nombre del fichero fuente
    private String sNomFichFuente = "";
    private String sErrorFicheros = "";

    public AnalizadorLex (String sNomFichFuente, boolean bModoTraza, GestorErrores gestErr){
        this.archivo = new Archivo(sNomFichFuente, Archivo.MODO_LECTURA);
        this.sNomFichFuente = sNomFichFuente;
        inicializar (bModoTraza, gestErr);
        if (this.archivo.getError()){
            this.sErrorFicheros += "** Se ha producido un error al intentar abrir el arhivo: " + sNomFichFuente + " **";
            this.gestErr.escribeError(this.sErrorFicheros);
        }
    }

    public AnalizadorLex (BufferedReader br, boolean bModoTraza,GestorErrores gestErr){
        this.archivo = new Archivo(br);
        inicializar (bModoTraza, gestErr);
        if (this.archivo.getError()){
            this.sErrorFicheros += "** Se ha producido un error al intentar abrir el arhivo: " + sNomFichFuente + " **";
            this.gestErr.escribeError(this.sErrorFicheros);
        }
    }
    
    private void inicializar(boolean bModoTraza,GestorErrores gestErr){
        this.gestErr = gestErr;
        this.listaTokens = new Hashtable();
        this.listaPalRes = new Hashtable();
        this.listaPalConv = new Hashtable();
        this.car = ' ';
        this.lexema = "";
        //Si la ejecucion es en modo Traza abro el archivo de trazas del Lexico
        this.bModoTraza = bModoTraza;
        if (this.bModoTraza){
            this.archivoTrazas = new Archivo (NOM_FICH_TRAZAS_ALEX, Archivo.MODO_ESCRITURA);
            if (this.archivoTrazas.getError()){
                this.sErrorFicheros += "** Se ha producido un error al intentar abrir el arhivo: " + sNomFichFuente + " **";
                this.gestErr.escribeError(this.sErrorFicheros);
            }
        }
        //Establezco el estado inicial.
        this.estado = 0;
        //this.token = new Token ();
        this.numToken = 0;
        this.posToken = 0;
        this.fin = false;
        this.abortar = false;
        //Inicializo los punteros de lectura del fichero (la posicion del caracter actual).
        this.iNumFilaFich = 0;
        this.iNumColumnaFich = 0;        
        //Inicializar la tabla de palabras reservadas.
        this.tablaPalRes();
        this.tablaPalConv();
    }

    public Hashtable getListaTokens (){

        return this.listaTokens;

    }

    public Hashtable getListaPalRes(){

        return this.listaPalRes;
        
    }

    public Hashtable getListaPalConv(){

        return this.listaPalConv;
        
    }
    
    public Token siguienteToken(){
       if (this.posToken < this.listaTokens.size()){
          Token res = (Token)this.listaTokens.get(this.posToken);
          //Modo debug en la consola.
          if (this.textAreaTokens != null){
              this.textAreaTokens.setText(this.textAreaTokens.getText() + res.toString());
          }
          this.posToken++;
          return res;
       }
       return null;
    }

//    public void inicioScan (){
//        this.car = this.archivo.siguienteCar();
//        this.iNumFilaFich++;
//        this.iNumColumnaFich++;        
//    }

    public void scanner(){
        //Leo el primer caracter del fichero.
        this.car = this.archivo.siguienteCar();
        this.iNumFilaFich++;
        this.iNumColumnaFich++; 
        //Si estamos depurando almaceno el caracter leido
        if (this.bModoTraza){
            this.sbCodFuente.append(this.iNumFilaFich + ") " + this.car);
        }
        //Los errores lexicos NO DEBEN PARAR LA EJECUCION DEL A. LEXICO
//        while ((this.archivo.getBuff()!=-1) && (!this.abortar)){
        while (this.archivo.getBuff()!=-1){
            this.aflex();
        }
//        if (!this.abortar){
            //Procesar el ultimo caracter (y si es necesario el ultimo token)
            //De cara al lexico trato el EOF como un blanco para que no haya problemas.
            this.car = ' ';     
            this.aflex(); 
            /*Generamos la categoría léxica correspondiente a fin de fichero
             * para que el analizador sintáctico sepa cuándo parar si todo ha ido bien.
             * En este caso particular se le pasa el numero de fila y de columna del ultimo
             * caracter leido del fichero (EOF).
             */
            Token token = new Token ("fin","", this.iNumFilaFich, this.iNumColumnaFich);
            this.devuelveToken(token);
            //System.out.println("Análisis léxico efectuado con éxito.");
//        }
        this.archivo.cierraArchivo();
        if (this.bModoTraza)
            this.archivoTrazas.cierraArchivo();
    }

    private void aflex() {
        Token token;
        switch (this.estado) {
            case 0:
                //Estado inicial a partir del que se empieza a reconocer tokens.
                //Almaceno la fila y la columna de inicio del token actual.
                this.iNumFilaTok = this.iNumFilaFich;
                this.iNumColumnaTok = this.iNumColumnaFich;
                if ((this.car == '\t') || (this.car == '\r') || (this.car == '\n') || this.car == ' ') {
                    this.transita(0);
                    //Inicializo el lexema
                    this.lexema = "";
                } else {
                    //Seguimos implementando el autómata...
                    switch (this.car) {
                        case '+':
                            this.transita(13);
                            break;
                        case '-':
                            this.transita(14);
                            break;
                        case '/':
                            this.transita(15);
                            break;
                        case '<':
                            this.transita(16);
                            break;
                        case '>':
                            this.transita(17);
                            break;
                        case '%':
                            this.transita(18);
                            break;
                        case '*':
                            this.transita(19);
                            break;
                        case '(':
                            this.transita(20);
                            break;
                        case ')':
                            this.transita(21);
                            break;
                        case '&':
                            this.transita(22);
                            break;
                        case ';':
                            this.transita(23);
                            break;
                        case ':':
                            this.transita(24);
                            break;
                        case '|':
                            this.transita(25);
                            break;
                        case '=' :
                            this.transita(30);
                            break;
                        case '[' :
                            this.transita(36);
                            break;
                        case ']' :
                            this.transita(37);
                            break;
                        case ',' :
                            this.transita(38);
                            break;
                        case '.' :
                            this.transita(40);
                            break;
                        case '{' :
                            this.transita(41);
                            break;
                        case '}' :
                            this.transita(42);
                            break;
                        case '0' :
                            this.transita(1);
                            break;
                        case '1' :
                            this.transita(2);
                            break;
                        case '2' :
                            this.transita(2);
                            break;
                        case '3' :
                            this.transita(2);
                            break;
                        case '4' :
                            this.transita(2);
                            break;
                        case '5' :
                            this.transita(2);
                            break;
                        case '6' :
                            this.transita(2);
                            break;
                        case '7' :
                            this.transita(2);
                            break;
                        case '8' :
                            this.transita(2);
                            break;
                        case '9' :
                            this.transita(2);
                            break;
                        case '\'': 
                            this.transita(10);
                            break;
                        case '#' :
                            this.transita(35);
                            break;
                        default:
                            if (this.esLetra(this.car)){
                                this.transita(34);
                            } else {
                                //Tratamiento especial: se llama a transita para avanzar la posicion 
                                //de lectura y saltar el caracter actual que esta dando problemas.
                                transita (0);
                                this.tratarError(0);
//                              this.error(this.estado);
                            }
                            break;
                    }
                }
                break;
            case 1 :
                switch (this.car){
                    case 'e' :
                        this.transita(6);
                        break;
                    case 'E' :
                        this.transita(6);
                        break;
                    case '.' :
                        this.transita(3);
                        break;
                    case '0' :
                    case '1' :
                    case '2' :
                    case '3' :
                    case '4' :
                    case '5' :
                    case '6' :
                    case '7' :
                    case '8' :
                    case '9' :
                        this.tratarError(5);
                        break;
                    default :
                        token = new Token ("nat",this.lexema, this.iNumFilaTok, this.iNumColumnaTok);
                        this.devuelveToken(token);
                        break;
                }
                break;
            case 2 :
                switch (this.car) {
                    case '0' :
                        this.transita(2);
                        break;
                    case '1' :
                        this.transita(2);
                        break;
                    case '2' :
                        this.transita(2);
                        break;
                    case '3' :
                        this.transita(2);
                        break;
                    case '4' :
                        this.transita(2);
                        break;
                    case '5' :
                        this.transita(2);
                        break;
                    case '6' :
                        this.transita(2);
                        break;
                    case '7' :
                        this.transita(2);
                        break;
                    case '8' :
                        this.transita(2);
                        break;
                    case '9' :
                        this.transita(2);
                        break;
                    case '.' :
                        this.transita(3);
                        break;
                    case 'e' :
                        this.transita(6);
                        break;
                    case 'E' :
                        this.transita(6);
                        break;
                    default :
                        token = new Token ("nat",this.lexema, this.iNumFilaTok, this.iNumColumnaTok);
                        this.devuelveToken(token);
                        break;
                }
                break;
            case 3 :
                switch (this.car){
                    case '0' :
                        this.transita(4);
                        break;
                    case '1' :
                        this.transita(4);
                        break;
                    case '2' :
                        this.transita(4);
                        break;
                    case '3' :
                        this.transita(4);
                        break;
                    case '4' :
                        this.transita(4);
                        break;
                    case '5' :
                        this.transita(4);
                        break;
                    case '6' :
                        this.transita(4);
                        break;
                    case '7' :
                        this.transita(4);
                        break;
                    case '8' :
                        this.transita(4);
                        break;
                    case '9' :
                        this.transita(4);
                        break;
                    default :
//                        this.error(this.estado);
                        this.tratarError(1);
                        break;
                }
                break;
            case 4 :
                switch (this.car){
                    case '0' :
                        this.transita(5);
                        break;
                    case '1' :
                        this.transita(4);
                        break;
                    case '2' :
                        this.transita(4);
                        break;
                    case '3' :
                        this.transita(4);
                        break;
                    case '4' :
                        this.transita(4);
                        break;
                    case '5' :
                        this.transita(4);
                        break;
                    case '6' :
                        this.transita(4);
                        break;
                    case '7' :
                        this.transita(4);
                        break;
                    case '8' :
                        this.transita(4);
                        break;
                    case '9' :
                        this.transita(4);
                        break;
                    case 'e' :
                        this.transita(6);
                        break;
                    case 'E' :
                        this.transita(6);
                        break;
                    default :
                        token = new Token ("real",this.lexema, this.iNumFilaTok, this.iNumColumnaTok);
                        this.devuelveToken(token);
                        break;
                }
                break;
            case 5 :
                switch (this.car){
                    case '0' :
                        this.transita(5);
                        break;
                    case '1' :
                        this.transita(4);
                        break;
                    case '2' :
                        this.transita(4);
                        break;
                    case '3' :
                        this.transita(4);
                        break;
                    case '4' :
                        this.transita(4);
                        break;
                    case '5' :
                        this.transita(4);
                        break;
                    case '6' :
                        this.transita(4);
                        break;
                    case '7' :
                        this.transita(4);
                        break;
                    case '8' :
                        this.transita(4);
                        break;
                    case '9' :
                        this.transita(4);
                        break;
                    default :
//                        this.error(this.estado);
                        this.tratarError(1);
                }
                break;
            case 6 :
                switch (this.car){
                    case '0' :
                        this.transita(8);
                        break;
                    case '1' :
                        this.transita(9);
                        break;
                    case '2' :
                        this.transita(9);
                        break;
                    case '3' :
                        this.transita(9);
                        break;
                    case '4' :
                        this.transita(9);
                        break;
                    case '5' :
                        this.transita(9);
                        break;
                    case '6' :
                        this.transita(9);
                        break;
                    case '7' :
                        this.transita(9);
                        break;
                    case '8' :
                        this.transita(9);
                        break;
                    case '9' :
                        this.transita(9);
                        break;
                    case '-' :
                        this.transita(7);
                        break;
                    default :
//                        this.error(this.estado);
                        this.tratarError(2);
                        break;
                }
                break;
            case 7 :
                switch (this.car){
                    case '0' :
                        this.transita(8);
                        break;
                    case '1' :
                        this.transita(9);
                        break;
                    case '2' :
                        this.transita(9);
                        break;
                    case '3' :
                        this.transita(9);
                        break;
                    case '4' :
                        this.transita(9);
                        break;
                    case '5' :
                        this.transita(9);
                        break;
                    case '6' :
                        this.transita(9);
                        break;
                    case '7' :
                        this.transita(9);
                        break;
                    case '8' :
                        this.transita(9);
                        break;
                    case '9' :
                        this.transita(9);
                        break;
                    default :
//                        this.error(this.estado);
                        this.tratarError(2);
                        break;
                }
                break;
            case 8 :
                switch (this.car){
                    case '0' :
                    case '1' :
                    case '2' :
                    case '3' :
                    case '4' :
                    case '5' :
                    case '6' :
                    case '7' :
                    case '8' :
                    case '9' :
                        this.tratarError(2);
                        break;
                    default :
                        token = new Token ("real",this.lexema, this.iNumFilaTok, this.iNumColumnaTok);
                        this.devuelveToken(token);
                        break;
                }
                break;
            case 9 :
                switch (this.car){
                    case '0' :
                        this.transita(9);
                        break;
                    case '1' :
                        this.transita(9);
                        break;
                    case '2' :
                        this.transita(9);
                        break;
                    case '3' :
                        this.transita(9);
                        break;
                    case '4' :
                        this.transita(9);
                        break;
                    case '5' :
                        this.transita(9);
                        break;
                    case '6' :
                        this.transita(9);
                        break;
                    case '7' :
                        this.transita(9);
                        break;
                    case '8' :
                        this.transita(9);
                        break;
                    case '9' :
                        this.transita(9);
                        break;
                    default :
                        token = new Token ("real",this.lexema, this.iNumFilaTok, this.iNumColumnaTok);
                        this.devuelveToken(token);
                        break;
                }
                break;
            case 10 :
               // if (this.esLetra(this.car)||this.esDigito(this.car)){
                    this.transita(11);
               // } else {
                //    this.error(this.estado);
                //}
                break;
            case 11 :
                if (this.car == '\''){
                    this.transita(12);
                } else {
//                    this.error(this.estado);
                    this.tratarError(3);
                }
                break;
            case 12 :
                token = new Token ("car",this.lexema, this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 13:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                /* En los casos de los operadores, el propio lexema
                 * va a identificar el tipo del operador, ya que habrá una
                 * categoría léxica para cada uno, y los tokens resultantes
                 * serán de la forma ("+",""),("-","")...
                 */
                this.devuelveToken(token);
                break;
            case 14:
                if (this.car == '>') {
                    this.transita(39);
                } else {
                    token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                    this.devuelveToken(token);
                }
                break;
            case 15:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 16:
                if (this.car == '=') {
                    this.transita(26);
                } else if (this.car == '<') {
                    this.transita(27);
                } else {
                    token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                    this.devuelveToken(token);
                }

                break;
            case 17:
                if (this.car == '=') {
                    this.transita(28);
                } else if (this.car == '>') {
                    this.transita(29);
                } else {
                    token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                    this.devuelveToken(token);
                }
                break;
            case 18:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 19 :
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 20:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 21:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 22:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 23:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 24:
                if (this.car == '='){
                    this.transita(33);
                } else {
                    token = new Token(this.lexema,"", this.iNumFilaTok, this.iNumColumnaTok);
                    this.devuelveToken(token);
                }
                break;
            case 25:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 26:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 27:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 28 :
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 29 :
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 30 :
                if (this.car == '/'){
                    this.transita(31);
                } else {
                    token = new Token (this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                    this.devuelveToken(token);
                }
                break;
            case 31 :
                if (this.car == '='){
                    this.transita(32);
                } else {
//                    this.error(this.estado);
                    this.tratarError(4);
                }
                break;
            case 32 :
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 33 :
                token = new Token (this.lexema,"", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 34 :
                if (esLetra(this.car)||esDigito(this.car)){
                    this.transita(34);
                } else {
                    if (this.listaPalRes.containsKey(this.lexema)){
                        token = new Token ("palRes",this.lexema, this.iNumFilaTok, this.iNumColumnaTok);
                    } else {
                        token = new Token ("identificador",this.lexema, this.iNumFilaTok, this.iNumColumnaTok);
                    }
                    this.devuelveToken(token);
                }
                break;
            case 35 :
                if (this.car == '\r' || this.car == '\n'){
                    this.estado = 0;
                    this.lexema = "";
                } else {
                    this.transita(35);
                }
                break;
            case 36:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 37:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 38:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 39:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 40:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 41:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
            case 42:
                token = new Token(this.lexema, "", this.iNumFilaTok, this.iNumColumnaTok);
                this.devuelveToken(token);
                break;
                
            default:
                break;

        }

    }

    /**
     * Transita del estado actual al estado que recibe como parametro
     * Incorpora el caracter actual al lexema actual y lee el siguiente
     * caracter del fichero (AVANZA LA POSICION DE LECTURA DEL FICHERO).
     * @param estado
     */
  
    private void transita (int estado){

        String aux = String.valueOf(this.car);
        this.lexema = this.lexema + aux;
        if (this.car == '\n'){
            //Actualizo el numero de fila e Inicializo el numero de columna.
            this.iNumColumnaFich = 1;
            this.iNumFilaFich++;
            if (this.bModoTraza){
                this.sbCodFuente.append(this.iNumFilaFich + ") ");
            }
        }else
            //Actualizo el numero de columna;
            this.iNumColumnaFich++;
        this.car = this.archivo.siguienteCar();
        //Si estamos depurando almaceno el caracter leido
        if (this.bModoTraza){
            this.sbCodFuente.append(this.car);
        }
        this.estado = estado;
    }

     /**
      * Incorpora a la lista de tokens reconocidos el token que recibe
      * como parametro.
      * Actualiza el contador de tokens, vuelve al estado inicial e 
      * inicializa el lexema actual.
      * NO AVANZA LA POSICION DE LECTURA DEL FICHERO.
      * @param token
      */
    private void devuelveToken (Token token){
        //Si estamos en modo traza escribo en el fichero de trazas los datos del token
        if (this.bModoTraza)
            this.archivoTrazas.escribe(token.toString());
        this.listaTokens.put(this.numToken, token);
        this.numToken ++;
        this.estado = 0;
        this.lexema = "";

    }

    /**
     * Vuelve al estado inicial, inicializa el lexema actual y muestra un 
     * mensaje de error por pantalla.
     * NO SE AVANZA LA POSICION DE LECTURA PARA NO PERDER EL CARACTER ACTUAL.
     * @param codError
     */
    private void tratarError (int codError){
        this.estado = 0;
        this.lexema = "";
        error (codError);
    }
    
    /**
     * Muestra por pantalla un mensaje de error del analisis
     * lexico, incluyendo la fila y la columna de inicio del lexema erroneo.
     * AUNQUE HAYA ERRORES NO SE ABORTA LA EJECUCION DEL A. LEXICO.
     * @param codError
     */
    private void error (int codError){
        String sCadena = "Linea: " + this.iNumFilaTok + " Col: " +
                this.iNumColumnaTok + " " + mensajesError[codError];
        //Anotamos el error en la tabla de errores del GestorErrores
        this.gestErr.escribeError(sCadena);
        if (this.bModoTraza)
            this.archivoTrazas.escribe(sCadena + "\r\n");
    }

    private boolean esDigito (char car){
        return (48 <= car) && (car <= 57);
    }

    private boolean deUnoaNueve (char car){
        return (49<= car) && (car <= 57);
    }

    private boolean lower (char car){
        return (97 <= car) && (car <= 122);
    }

    private boolean upper (char car){
        return (65 <= car) && (car <= 90);
    }

    private boolean esLetra (char car){
        //para una prueba
        int test = car;
        return this.lower(car) || this.upper(car);
    }


    private void tablaPalRes (){
        this.listaPalRes.put("true","");
        this.listaPalRes.put("false", "");
        this.listaPalRes.put("and","");
        this.listaPalRes.put("or", "");
        this.listaPalRes.put("not", "");
        this.listaPalRes.put("boolean","");
        this.listaPalRes.put("character", "");
        this.listaPalRes.put("natural","");
        this.listaPalRes.put("integer", "");
        this.listaPalRes.put("float", "");
        this.listaPalRes.put("nat", "");
        this.listaPalRes.put("int","");
        this.listaPalRes.put("char", "");
        this.listaPalRes.put("in", "");
        this.listaPalRes.put("out", "");
        this.listaPalRes.put("if","");
        this.listaPalRes.put("then", "");
        this.listaPalRes.put("else", "");
        this.listaPalRes.put("while", "");
        this.listaPalRes.put("do", "");
        this.listaPalRes.put("for", "");
        this.listaPalRes.put("to", "");
        this.listaPalRes.put("tipo", "");
        this.listaPalRes.put("array", "");
        this.listaPalRes.put("of", "");
        this.listaPalRes.put("record", "");
        this.listaPalRes.put("pointer", "");
        this.listaPalRes.put("null", "");
        this.listaPalRes.put("new", "");
        this.listaPalRes.put("dispose", "");
        this.listaPalRes.put("procedure", "");
        this.listaPalRes.put("var", "");
        this.listaPalRes.put("forward", "");
        
    }

    private void tablaPalConv (){

        this.listaPalConv.put("float", "");
        this.listaPalConv.put("int", "");
        this.listaPalConv.put("nat", "");
        this.listaPalConv.put("char", "");
    }

    public void setTextArea (JTextArea textAreaTokens){
        //Establecer el modo debug en consola
        this.textAreaTokens = textAreaTokens;
    }

    public StringBuffer getCodFuente(){
        return this.sbCodFuente;
    }
    
    public String getNomFichFuente(){
        return this.sNomFichFuente;
    }

    public String getErrorFicheros() {
        return this.sErrorFicheros;
    }
}
